package com.ftg.learn.theory.pattern;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 动态代理
 *
 * @author 布衣
 */
public class DynamicProxy {

    /**
     * 编写一个可以动态生成sqlproxy实现类的方法
     */
    public static SqlProxy getSqlProxy() {
        return new SqlProxy() {
            @Override
            public String createSelect() {
                return "select * from A";
            }
        };
    }

    public static SqlProxy getSqlProxy(String sql) {
        //this 本类的实现
        //this 也可以表示一个正在运行的java里面的类或者接口  DynamicProxy

        //反射机制  ： 获取类对象机制  【可以正在运行的类或者接口的机制】
        //1 : 类名  DynamicProxy.class -> 关联对象【DynamicProxy.class】  【目标DynamicProxy】
//        Class c = DynamicProxy.class;
//        Object o = c.newInstance();
//        o 就是目标对象的实例
//        c  关联对象  DynamicProxy 目标   DynamicProxy.class 是c地址
//         于学文  - 获取类对象机制 -》 找到一个人
        //2 : 实例  2.1 this.getClass();  2.2 DynamicProxy d = new DynamicProxy();d.getClass();
        //3 : 包地址  Class.forName(类地址);

        // 如何获得一个类的加载器 this.getClass().getClassLoad();
        return (SqlProxy) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),
                new Class[]{SqlProxy.class}, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println(proxy.getClass().getName()+"==proxy名称");
                        System.out.println(method.getName()+"==proxy方法");
                        System.out.println(Arrays.toString(args)+"==args参数");
                        //1 反射的原理  ： 思路
                        //2 代理的原理   : 思路
                        //3  写的代码看一下
                        return null;
                    }
                });
    }

    public static void main(String[] args) {
        SqlProxy sqlProxy = getSqlProxy("select * from A");
        System.out.println(sqlProxy.createSelect());
    }

}
